package com.zykj.abstractfactory;

/**
 * @author zhoulj(周利军) [1217102780@qq.com]
 * @Title: PizzaStore
 * @Project: ${MODEL_NAME}
 * @Module ID:   <(模块)类编号，可以引用系统设计中的类编号>
 * @Comments: <对此类的描述，可以引用系统设计中的描述>
 * @JDK version used:      <JDK1.8> 40
 * @since 2018/12/27-13:40
 */
//TODO 这里的工厂方法 一般使用抽象类， 只将这里的对象创建交给子类实现， 但是其他的如 orderPizza 是在本类中实现了的 而且还可以固定为 final 类型 让之类不能修改
public abstract class PizzaStore {

    public abstract Pizza createPizza(String type);

    //所有加盟店 对于订单处理都一致   这里甚至可以直接声明为  final 类型 防止子类修改该订单处理逻辑
    //TODO 这里的披萨创建和使用 完全隔离了， orderPizza方法只管销售 他并不知道创建的是哪种披萨
    //  定义：定义了一个创建对象的接口，但由子类确定要实例化哪一个，让实例化推迟到子类中
    //  注意：和简单工厂的区别》 原本创建子类的工作在一个单独的类中， 现在转变为由一群子类来负责实例化
    //  1:工厂方法用来处理对象的创建，并将这样的行为封装在之类中， 就达到 对象的创建和超类中的代码 解耦了 （创建和使用 产品的逻辑分离开来）
    //  2:工厂方法 一定是抽象的， 这样可以让子类实现各自的 生成创建实例的逻辑
    //  3:工厂方法 通过让子类决定该创建的对象是什么
    //  4:不能让高层组件直接依赖底层组件   （高层组件：由其他底层组件定义其行为的类  PizzaStore是高层组件因为他的行为由披萨定义，而披萨是底层组件）
    //  *5:由子类决定实例化哪个具体类


    public void orderPizza(String type) {
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cute();
        pizza.bake();
    }
}
